package com.english.controller;

import com.english.utils.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * 图片上传控制器
 * 支持图片上传到本机并能让小程序访问
 *
 * @author sqh
 * @since 2025-08-03
 */
@RestController
@RequestMapping("/api/upload")
@CrossOrigin
public class uploadController {

    /**
     * 图片存储路径（从配置文件读取）
     */
    @Value("${upload.image.path:upload/images}")
    private String uploadPath;

    /**
     * 图片访问URL前缀
     */
    @Value("${upload.image.url-prefix:/images}")
    private String urlPrefix;

    /**
     * 上传课程安排图片
     *
     * @param file 上传的图片文件
     * @return 上传结果
     */
    @PostMapping("/course")
    public R<String> uploadCourseImage(@RequestParam("file") MultipartFile file) {
        return uploadImageToPath(file, "course");
    }

    /**
     * 上传关于我们图片
     *
     * @param file 上传的图片文件
     * @return 上传结果
     */
    @PostMapping("/about")
    public R<String> uploadAboutImage(@RequestParam("file") MultipartFile file) {
        return uploadImageToPath(file, "about");
    }

    /**
     * 通用图片上传方法
     *
     * @param file 上传的图片文件
     * @param subPath 子目录名称
     * @return 上传结果
     */
    private R<String> uploadImageToPath(MultipartFile file, String subPath) {
        try {
            System.out.println("开始上传图片，文件名：" + file.getOriginalFilename());
            String targetPath = uploadPath + "/" + subPath;
            System.out.println("配置的上传路径：" + targetPath);

            // 检查文件是否为空
            if (file.isEmpty()) {
                return R.error("请选择要上传的图片");
            }

            // 检查文件类型
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || originalFilename.isEmpty()) {
                return R.error("文件名不能为空");
            }

            // 获取文件扩展名
            String fileExtension = getFileExtension(originalFilename);
            if (!isValidImageExtension(fileExtension)) {
                return R.error("只支持jpg、jpeg、png、gif格式的图片");
            }

            // 检查文件大小（限制为5MB）
            if (file.getSize() > 5 * 1024 * 1024) {
                return R.error("图片大小不能超过5MB");
            }

            // 使用服务器路径 - 在web应用的根目录下创建上传目录
            File uploadDir = new File(targetPath);
            System.out.println("服务器路径：" + uploadDir.getAbsolutePath());

            if (!uploadDir.exists()) {
                boolean created = uploadDir.mkdirs();
                System.out.println("目录创建结果：" + created);
                if (!created) {
                    return R.error("创建上传目录失败，路径：" + uploadDir.getAbsolutePath());
                }
            }

            // 生成唯一文件名
            String fileName = UUID.randomUUID().toString() + fileExtension;
            File destFile = new File(uploadDir, fileName);
            System.out.println("目标文件路径：" + destFile.getAbsolutePath());

            // 使用具体类型替换var，兼容Java 8
            try (java.io.FileOutputStream fos = new java.io.FileOutputStream(destFile);
                 java.io.InputStream inputStream = file.getInputStream()) {

                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    fos.write(buffer, 0, bytesRead);
                }
                fos.flush();
            }

            System.out.println("文件保存成功");

            // 返回相对路径
            String fullUrl = urlPrefix + "/" + subPath + "/" + fileName;
            System.out.println("返回完整URL: " + fullUrl);

            return R.success("上传成功", fullUrl);

        } catch (IOException e) {
            e.printStackTrace();
            return R.error("图片上传失败：" + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("图片上传失败：" + e.getMessage());
        }
    }

    /**
     * 上传普通图片
     *
     * @param file 上传的图片文件
     * @return 上传结果
     */
    @PostMapping("/image")
    public R<String> uploadImage(@RequestParam("file") MultipartFile file) {
        try {
            System.out.println("开始上传图片，文件名：" + file.getOriginalFilename());
            System.out.println("配置的上传路径：" + uploadPath);

            // 检查文件是否为空
            if (file.isEmpty()) {
                return R.error("请选择要上传的图片");
            }

            // 检查文件类型
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || originalFilename.isEmpty()) {
                return R.error("文件名不能为空");
            }

            // 获取文件扩展名
            String fileExtension = getFileExtension(originalFilename);
            if (!isValidImageExtension(fileExtension)) {
                return R.error("只支持jpg、jpeg、png、gif格式的图片");
            }

            // 检查文件大小（限制为5MB）
            if (file.getSize() > 5 * 1024 * 1024) {
                return R.error("图片大小不能超过5MB");
            }

            // 使用服务器路径 - 在web应用的根目录下创建上传目录
            File uploadDir = new File(uploadPath);
            System.out.println("服务器路径：" + uploadDir.getAbsolutePath());

            if (!uploadDir.exists()) {
                boolean created = uploadDir.mkdirs();
                System.out.println("目录创建结果：" + created);
                if (!created) {
                    return R.error("创建上传目录失败，路径：" + uploadDir.getAbsolutePath());
                }
            }

            // 生成唯一文件名
            String fileName = UUID.randomUUID().toString() + fileExtension;
            File destFile = new File(uploadDir, fileName);
            System.out.println("目标文件路径：" + destFile.getAbsolutePath());

            // 使用具体类型替换var，兼容Java 8
            try (java.io.FileOutputStream fos = new java.io.FileOutputStream(destFile);
                 java.io.InputStream inputStream = file.getInputStream()) {

                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    fos.write(buffer, 0, bytesRead);
                }
                fos.flush();
            }

            System.out.println("文件保存成功");

            // 成功上传，返回文件访问URL
            System.out.println("文件上传成功，返回URL: " + urlPrefix + "/" + fileName);

            // 返回相对路径
            String fullUrl = urlPrefix + "/" + fileName;
            System.out.println("返回完整URL: " + fullUrl);

            return R.success("上传成功", fullUrl);

        } catch (IOException e) {
            e.printStackTrace();
            return R.error("图片上传失败：" + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("图片上传失败：" + e.getMessage());
        }
    }

    /**
     * 删除图片
     *
     * @param imageUrl 图片URL
     * @return 删除结果
     */
    @DeleteMapping("/image")
    public R<String> deleteImage(@RequestParam("imageUrl") String imageUrl) {
        try {
            // 从URL中提取文件名
            String fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1);
            String filePath = uploadPath + File.separator + fileName;

            File file = new File(filePath);
            if (file.exists() && file.delete()) {
                return R.success("图片删除成功");
            } else {
                return R.error("图片删除失败，文件不存在");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("图片删除失败：" + e.getMessage());
        }
    }

    /**
     * 获取文件扩展名
     */
    private String getFileExtension(String filename) {
        int lastDotIndex = filename.lastIndexOf(".");
        if (lastDotIndex > 0) {
            return filename.substring(lastDotIndex).toLowerCase();
        }
        return "";
    }

    /**
     * 检查文件扩展名是否有效
     */
    private boolean isValidImageExtension(String extension) {
        return extension.equals(".jpg") || 
               extension.equals(".jpeg") || 
               extension.equals(".png") || 
               extension.equals(".gif");
    }
}